package com.chenjt.jvm.second.four_classLife;

import java.util.Random;

/**
 * 注释：
 *
 * 3.引用常量不会触发此类或接口的初始化。因为常量在链接阶段就已经被显式赋值了。
 * 4.调用ClassLoader类的loadClass()方法加载一个类，并不是对类的主动使用，不会导致类的初始化
 *
 * @author chenjt
 * @date 2025/7/2 10:23
 */
public class PassiveUse2 {


    public static void main(String[] args) {
//        test1();
        test2();
    }

    public static void test1() {
        /**
         * 输出：1
         * 3.引用常量不会触发此类或接口的初始化。因为常量在链接阶段就已经被显式赋值了。
         */
        System.out.println(Person.NUM);
    }


    public static void test2() {
        /**
         * 输出：1
         * 3.引用常量不会触发此类或接口的初始化。因为常量在链接阶段就已经被显式赋值了。
         */
        System.out.println(SerialA.ID);
    }


    public static void test3(){
        try {
            /**
             * 4.调用ClassLoader类的loadClass()方法加载一个类，并不是对类的主动使用，不会导致类的初始化
             */
            Class<?> clazz = ClassLoader.getSystemClassLoader().loadClass("com.chenjt.jvm.second.four_classLife.Person");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


}

class Person{
    static{
        System.out.println("Person类的初始化");
    }
    // 在链接过程的准备环节就被赋值为1了
    public static final int NUM = 1;
    /**
     * 会执行类的<clinit>方法
     * 此时的赋值操作需要在<clinit>方法中执行
     */
    public static final int NUM1 = new Random().nextInt(10);

}



interface SerialA{

    public static final Thread t = new Thread(){
        {
            System.out.println("SerialA的初始化");
        }
    };

    // 不会执行类的<clinit>方法
    int ID = 1;
    /**
     * 会执行类的<clinit>方法
     * 此时的赋值操作需要在<clinit>方法中执行
     */
    int ID1 = new Random().nextInt(10);

}
